#pragma once
#include <functional>
#include <vector>
#include "More3D.h"
#include "MatrixTransformationShader.h"

#include "Renderer.h"
#include "ShaderProgram.h"

class TextureProxyShader : public ShaderProgram, public Renderer
{
  public:
    TextureProxyShader();

    /**
     * 使用 template<typename Lambda> 的话更简单
     * 但是 构造器的定义必须放在这里的头文件中，因为考虑到构造器中有着色器代码，
     * 不方便，所以这里使用 function 的方式
     */
    TextureProxyShader(
        vector<float> vertices, vector<int> indices,
        function<ShaderProgram*(const string&, const string&)> lambda);

    ~TextureProxyShader();

    unsigned int createShaderProgram() override;

    void prepareVAO();
    void update() override;
    void render();

    friend class More3D;
    
  private:
  ShaderProgram* target;
    vector<int> indices;
    int textureId;
    int textureLocation;
};